// pages/signin/signin.js
import { signin } from '../../server/signin';

const dateTool = require('../../utils/dateTool.js');

Page({

    /**
     * 页面的初始数据
     */
    data: {
        weekDayName: ['日', '一', '二', '三', '四', '五', '六'],
        day: [],           // 所有天数
        Signed: false,     // 今天是否签到
        ym: '',            // 今天所在的年月
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
        this.setYM();          // 显示当前年月
        this.setAllDay();      // 显示所有日期
        this.checkSigned();    // 检查是否已经签到了
        this.getSignedDays();  // 获取当月所有已经签到的日期
    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {

    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {

    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh() {

    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom() {

    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage() {

    },
    /*
     * 返回原页面的函数
     */
    returnMainPage () {
        wx.navigateBack({delta: 1});
    },

    setYM() {
        // 获取年月
        let now = new Date();
        let year = now.getFullYear();
        let month = now.getMonth() + 1;

        this.setData({
            ym: `${year}年${month}月`
        });
    },

    setAllDay() {
        // 日期列表
        let dateList = [];
        // 获取今天的日期
        const today = new Date();
        const today_format = dateTool.formatDate(today);
        // 获取今天的时间戳
        const nowTime = today.getTime();
        // 获取这个月第一天的时间戳
        const date = today.getDate();
        const firstDayTime = nowTime - ((date - 1) * 24 * 60 * 60 * 1000);
        // 将 firstDayTime 转换为日期对象
        const firstDay = new Date(firstDayTime);
        // 获取其是周几
        const firstDayOfWeek = firstDay.getDay();
        // 获取日历第一天的时间戳
        const dateListFirstDayTime = firstDayTime - (firstDayOfWeek * 24 * 60 * 60 * 1000);
        // 填充上个月的空日期
        for (let i = 0; i < firstDayOfWeek; i++) {
            let t = new Date(dateListFirstDayTime + (i * 24 * 60 * 60 * 1000));
            dateList.push({
                id: dateTool.formatDate(t),
                day: t.getDate(),
                isNowMonth: false,  // 是不是这个月
                isSign: false,      // 是不是签到日
                isToday: false      // 是不是今天
            });
        }
        // 填充这个月的日期
        // 获取这个月的总天数
        const daysInMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0).getDate();
        // 填充这个月的日期
        for (let i = 1; i <= daysInMonth; i++) {
            let t = new Date(firstDayTime + ((i-1) * 24 * 60 * 60 * 1000));
            let t_format = dateTool.formatDate(t);
            dateList.push({
                id: t_format,
                day: i,
                isNowMonth: true,   // 是这个月
                isSign: false,      // 假设目前没有签到日，根据实际情况更新
                isToday: (today_format == t_format)      // 是不是今天
            });
        }
        // 填充剩下的空位
        for (let i = 1; dateList.length % 7 != 0; i++) {
            let t = new Date(firstDayTime + ((i-1+daysInMonth) * 24 * 60 * 60 * 1000));
            dateList.push({
                id: dateTool.formatDate(t),
                day: i,
                isNowMonth: false,
                isSign: false,
                isToday: false      // 是不是今天
            });
        }
        // 更新页面
        this.setData({
            day: dateList
        });
    },
    // 检查用户是否已经签到
    checkSigned() {
        signin.checkSigned().then((res) => {
        if (res.success) {
            this.setData({
                Signed: res.signed
            });
        } else {
            wx.showToast({
                title: '请检查网络连接',
            });
        }
        }).catch((err) => {
            console.log(err);
            wx.showToast({
                title: '请检查网络连接',
            });
        });
    },
    /*
     * 用户签到
     */
    signin() {
        signin.signIn().then((res) => {
        if (res.success) {
            wx.showToast({
                title: res.msg,
            });
            this.setData({
                Signed: true
            });
            this.getSignedDays();
        } else {
            wx.showToast({
                title: '请检查网络连接',
            });
        }
        }).catch((err) => {
            console.log(err);
            wx.showToast({
                title: '请检查网络连接',
            });
        });
    },
    /*
     * 用户不需要签到时运行的逻辑
     */
    signed() {
        wx.showToast({
            title: '今日已签到',
            icon: 'none',
            duration: 1000
        });
        console.log('用户不需要签到');
    },
    /*
     * 用户按下签到按钮的事件
     */
    onTapSignin() {
        if (this.data.Signed) {
            this.signed();
        } else {
            this.signin();
        }
    },

    /*
     * 获取当月所有已经签到的日期
     */
    getSignedDays() {
        signin.getSignedDays().then((res) => {
            if (res.success) {
                // 获取到本月已签到的日期
                let signedDateList = res.data.map(item => item.signedDate);
                let tmp = new Set(signedDateList);
                // 刷新每日签到页面里的样式
                let old_arr = this.data.day;
                for (let i = 0; i < old_arr.length; i++) {
                    // 如果对应的id存在于数组 tmp中，则将isSign设置为true
                    if (tmp.has(old_arr[i].id)) {
                        old_arr[i].isSign = true;
                    } else {
                        old_arr[i].isSign = false;
                    }
                }
                this.setData({
                    day: old_arr
                });
            } else {
                wx.showToast({
                    title: '请检查网络连接',
                });
            }
        }).catch((err) => {
            console.log(err);
            wx.showToast({
                title: '请检查网络连接',
            });
        });
    }
})